# frozen_string_literal: true

# 处理安装包的各种问题，运用到 Ubuntu 系统的 apt 命令，Suse 系统的 zypper 命令等。

require_relative 'shell'
require_relative 'env'

class Packages
  attr_reader :os

  def initialize(package_manager, os)
    @package_manager = package_manager
    @os = os
  end

  # install 方法支持多种模式。
  #
  # 1. 普通的报名，如 'libevent-devel'.
  # 2. 一个 Hash，它是操作系统的键名对，例如：
  #
  #    { 'Ubuntu': ['libevent-dev', 'ncurses-dev'],
  #      'openSUSE': ['libevent-devel', 'ncurses-devel'] }
  #
  # 3. 带有冒号（:）的包名，它由操作系统去解释实际的包映射，如 'libevent:devel'.
  #
  def install(*packages)
    packages = packages.map do |package|
      if package.is_a?(Hash)
        package = package[os.to_s] || package[os.to_sym]
        raise "尚未支持的操作系统：#{os}" unless package
      end

      package = [package] unless package.is_a?(Array)

      package
    end
    packages = packages.flatten
    @package_manager.install packages
  end
end

def packages
  # 首先生成 packages 资源
  require_relative "packages/#{env['OS'].downcase}"
  package_manager = PackageManager.const_get("#{env['OS'][0].upcase}#{env['OS'][1..-1]}").new
  the_packages = Packages.new(package_manager, env['OS'])

  # 然后定义 packages 的方法
  define_method(:packages) { the_packages }

  return the_packages
end
